// axios
import axios from 'axios';
// 引入ls 为了 存储token
import vueLS from './ls';
// 后台接口
import { baseURL, userApi,mediaApi } from './api';
// 拦截器使用vant组件
import { closeToast, showDialog, showToast } from 'vant';

// 实例化
let instance = axios.create({
  baseURL: baseURL, //url
  timeout: 15000, // 指定请求超时的毫秒数(0 表示无超时时间)
});

// 添加请求拦截器
// 参数有两个一个回调函数，和错误处理函数，基本都是固定语法
instance.interceptors.request.use(
  // 在发送请求之前做些什么回调函数
  (config) => {
    // 检查能否在local获取到token
    if (vueLS.get('token')) {
      config.headers.Authorization = vueLS.get('token');
    } else {
      config.headers.Authorization = '';
    }
    return config;
  },
  // 错误处理函数
  (err) => {
    return Promise.reject(err);
  }
);

// 添加响应拦截器
instance.interceptors.response.use(
  // 对响应数据做点什么
  (res) => {
    // console.log(res);
    if (res.status != 200) {
      showToast('请求失败');
      return false;
    }
    // response 的数据包含的更多内容，并不是返回值内容，返回值固定在response.data中
    //{err: 0, code: '0', msg: 'ok', total: 151, data: Array(20)}
    // 所以再从response取出data
    const result = res.data;
    // console.log(result);
    if (result.err != 0) {
      // 如果有错就给出模态提示
      showDialog({
        title: '提示',
        message: result.msg,
      });
      return false;
    }
    // 拦截器处理之后，赋值给返回值，才会由之后的then方法处理
    return result;
  },
  // 对响应错误做点什么
  (error) => {
    return Promise.reject(error);
  }
);


/**
 *  catch
 * 在实际应用中，通常建议使用 catch 方法来处理 Promise 链中的异常，
 * 因为它能够更清晰地将错误处理与链式调用分离开来，使得代码更易读和维护。
 */

// POST请求，默认是JSON
export const POST = (params) => {
  const { api, data } = params;
  return new Promise((resolve, reject) => {
    // axios 的post方法 参数 axios.post('/api/users', userData)
    instance.post(api, data)
      .then((result) => {
        // console.log(result);
        resolve(result);
      })
      .catch((err) => {
        showToast('请求失败');
        resolve(false);
      });
  });
};

export const GET = (params) => {
  const { api, data } = params;
  // console.log(data);
  return new Promise((resolve, reject) => {
    instance.get(api, { params: data, })
      .then((result) => {
        // console.log(result);
        resolve(result)
      })
      .catch((err) => {
        showToast('请求失败');
        resolve(false);
      });
  });
};

// UPLOAD上传文件 
// 这个比较特殊 ，文件上传使用的是form-data，需要在headers中设置Content-Type: multipart/form-data
export const UPLOAD = (formData) => {
  return new Promise((resolve, reject) => {
    instance.post(userApi.upload, formData, {
      headers: {
        'Content-Type': 'multipart/form-data',
      },
    })
      .then((result) => {
        resolve(result);
      })
      .catch((err) => {
        resolve(false);
      });
  });
};